package main
import (
	"fmt"
	"github.com/garyburd/redigo/redis"
)
//通过golang向redis写入数据和读取数据
func main(){
	
	//1、连接redis
	conn,err := redis.Dial("tcp","127.0.0.1:6379")
	if err != nil {
		fmt.Println("Redis Connect Error : ",err)
		return 
	}
	fmt.Println("Redis Connect Success : ",conn)
	defer conn.Close() //及时关闭连接~


	//2、通过golang写入数据 string类型【key - value】
	_,err = conn.Do("Set","name","tom猫~")  //Do方法是执行相应的redis指令，并传入参数就是数值
	if err != nil {
		fmt.Println("Set Error : ",err)
		return 
	}
	fmt.Println("Redis Set Success!")	


	//3、读取Redis中的数据
	r,err := redis.String(conn.Do("Get","name"))  //Do方法是执行相应的redis指令，并传入参数就是数值 
	//但是，这个Do方法所返回的是一个空接口（interface{}），所以需要类型转换，但是不能通过类型断言，只能通过redis的方法String（）
	if err != nil {
		fmt.Println("Get Error : ",err)
		return 
	}
	fmt.Println("Redis Get Success! ->",r)	


	//4、操作hash HSet  一个个存入
	_,err = conn.Do("HSet","user","name","Make")
	if err != nil {
		fmt.Println("HSet Error : ",err)
		return 
	}
	_,err = conn.Do("HSet","user","age",15)
	if err != nil {
		fmt.Println("HSet Error : ",err)
		return 
	}


	//5、HGet 获取hash数据 一个个获取
	s1,err := redis.String(conn.Do("HGet","user","name"))  //Do方法是执行相应的redis指令，并传入参数就是数值 
	//但是，这个Do方法所返回的是一个空接口（interface{}），所以需要类型转换，但是不能通过类型断言，只能通过redis的方法String（）
	if err != nil {
		fmt.Println("Get Error : ",err)
		return 
	}	
	s2,err := redis.Int(conn.Do("HGet","user","age"))  
	if err != nil {
		fmt.Println("Get Error : ",err)
		return 
	}
	fmt.Println("Redis HGet Success! -> s1 s2",s1,s2)	


	//6、批量操作Set/Get  Hash 和 String 相同做法不同在 HMSet/HMGet  MSet/MGet
	_,err = conn.Do("HMSet","person","name","Carl","age",22)
	if err != nil {
		fmt.Println("HSet Error : ",err)
		return 
	}
	s3,err := redis.Strings(conn.Do("HMGet","person","name","age"))
	if err != nil {
		fmt.Println("HGet Error : ",err)
		return 
	}
	//取出来的s3是一个集合类型的，所以通过遍历来获取
	fmt.Println("--->",s3)
	for i,v := range s3{
		fmt.Printf("s3[%d] = %v\n",i,v)
	}

	//7、给数据设置有效时间 expire 5秒
	_,err = conn.Do("expire","name",5)


	//8、List的相关操作：
	_,err = conn.Do("lpush","heros","宋江","武松","鲁智深")
	h,err := redis.String(conn.Do("lpop","heros"))
	fmt.Println("通过List pop出来的数据：",h)
	h,err = redis.String(conn.Do("lindex","heros",1))
	fmt.Println("通过List'index 查出来的数据：",h)
	heros,err := redis.Strings(conn.Do("lrange","heros",0,-1))
	fmt.Println("所有的Hero是：",heros)
	heroscount,err := redis.Int(conn.Do("llen","heros"))
	fmt.Println("所有的英雄数量：",heroscount)
}